package com.idconfirmsystem.lib;

import android.app.ActionBar;
import android.app.Activity;
import android.content.res.Configuration;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import java.lang.reflect.Method;

import com.idconfirmsystem.R;


public class ActionBarDrawerToggle extends android.support.v4.app.ActionBarDrawerToggle {

	private static final String TAG = ActionBarDrawerToggle.class.getName();

	protected Activity mActivity;
	protected DrawerLayout mDrawerLayout;

	protected int mOpenDrawerContentDescRes;
	protected int mCloseDrawerContentDescRes;
	protected DrawerArrowDrawable mDrawerImage;
	protected boolean animateEnabled;

	public ActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout, int drawerImageRes,
			int openDrawerContentDescRes, int closeDrawerContentDescRes) {
		super(activity, drawerLayout, drawerImageRes, openDrawerContentDescRes, closeDrawerContentDescRes);
	}

	public ActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout, DrawerArrowDrawable drawerImage,
			int openDrawerContentDescRes, int closeDrawerContentDescRes) {
		super(activity, drawerLayout, R.drawable.ic_drawer, openDrawerContentDescRes, closeDrawerContentDescRes);
		mActivity = activity;
		mDrawerLayout = drawerLayout;
		mOpenDrawerContentDescRes = openDrawerContentDescRes;
		mCloseDrawerContentDescRes = closeDrawerContentDescRes;
		mDrawerImage = drawerImage;
		animateEnabled = true;
	}

	public void syncState() {
		if (mDrawerImage == null) {
			super.syncState();
			return;
		}
		if (animateEnabled) {
			if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
				mDrawerImage.setProgress(1.f);
			} else {
				mDrawerImage.setProgress(0.f);
			}
		}
		setActionBarUpIndicator();
		setActionBarDescription();
	}

	public void setDrawerIndicatorEnabled(boolean enable) {
		if (mDrawerImage == null) {
			super.setDrawerIndicatorEnabled(enable);
			return;
		}
		setActionBarUpIndicator();
		setActionBarDescription();
	}

	public boolean isDrawerIndicatorEnabled() {
		if (mDrawerImage == null) {
			return super.isDrawerIndicatorEnabled();
		}
		return true;
	}

	public void onConfigurationChanged(Configuration newConfig) {
		if (mDrawerImage == null) {
			super.onConfigurationChanged(newConfig);
			return;
		}
		syncState();
	}

	public boolean onOptionsItemSelected(MenuItem item) {
		return super.onOptionsItemSelected(item);
	}

	@Override
	public void onDrawerSlide(View drawerView, float slideOffset) {
		if (mDrawerImage == null) {
			super.onDrawerSlide(drawerView, slideOffset);
			return;
		}
		if (animateEnabled) {
			mDrawerImage.setVerticalMirror(!mDrawerLayout.isDrawerOpen(GravityCompat.START));
			mDrawerImage.setProgress(slideOffset);
		}
	}

	@Override
	public void onDrawerOpened(View drawerView) {
		if (mDrawerImage == null) {
			super.onDrawerOpened(drawerView);
			return;
		}
		if (animateEnabled) {
			mDrawerImage.setProgress(1.f);
		}
		setActionBarDescription();
	}

	@Override
	public void onDrawerClosed(View drawerView) {
		if (mDrawerImage == null) {
			super.onDrawerClosed(drawerView);
			return;
		}
		if (animateEnabled) {
			mDrawerImage.setProgress(0.f);
		}
		setActionBarDescription();
	}

	protected void setActionBarUpIndicator() {
		if (mActivity != null) {
			try {
				Method setHomeAsUpIndicator = ActionBar.class.getDeclaredMethod("setHomeAsUpIndicator", Drawable.class);
				setHomeAsUpIndicator.invoke(mActivity.getActionBar(), mDrawerImage);
				return;
			} catch (Exception e) {
				Log.e(TAG, "setActionBarUpIndicator error", e);
			}

			final View home = mActivity.findViewById(android.R.id.home);
			if (home == null) {
				return;
			}

			final ViewGroup parent = (ViewGroup) home.getParent();
			final int childCount = parent.getChildCount();
			if (childCount != 2) {
				return;
			}

			final View first = parent.getChildAt(0);
			final View second = parent.getChildAt(1);
			final View up = first.getId() == android.R.id.home ? second : first;

			if (up instanceof ImageView) {
				ImageView upV = (ImageView) up;
				upV.setImageDrawable(mDrawerImage);
			}
		}
	}

	protected void setActionBarDescription() {
		if (mActivity != null && mActivity.getActionBar() != null) {
			try {
				Method setHomeActionContentDescription = ActionBar.class.getDeclaredMethod("setHomeActionContentDescription",
						Integer.TYPE);
				setHomeActionContentDescription.invoke(mActivity.getActionBar(), mDrawerLayout
						.isDrawerOpen(GravityCompat.START) ? mOpenDrawerContentDescRes : mCloseDrawerContentDescRes);
				if (Build.VERSION.SDK_INT <= 19) {
					mActivity.getActionBar().setSubtitle(mActivity.getActionBar().getSubtitle());
				}
			} catch (Exception e) {
				Log.e(TAG, "setActionBarUpIndicator", e);
			}
		}
	}

	public void setAnimateEnabled(boolean enabled) {
		this.animateEnabled = enabled;
	}

	public boolean isAnimateEnabled() {
		return this.animateEnabled;
	}

}
